home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 1
/
PC World Interactive 1 - Nisan 1997.iso
/
prog
/
graf
/
5
/
_001250_
< prev
next >
Wrap
Text File
|
1996-06-04
|
15KB
|
390 lines
//------------------------------------------------------------------------------------------------------
// Name : export_.c
// Date : 23.05.1996 Author : SM System : Win32
//------------------------------------------------------------------------------------------------------
// This file contains the language-independent implementation of the module EXPORT_.DLL. All texts and
// resources that are language-dependent are located in an additional EXPORT.DLL, whose sources can be
// found in the subdirectories \E (for English) and \D (for German).
//------------------------------------------------------------------------------------------------------
#define USER_DATA_ID "1.00-1995-08-10"
//------------------------------------------------------------------------------------------------------
#include "windows.h"
#include "windowsx.h"
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include "e:\release4\toso40.h" // Toso Interface 4.0 Definitions
#include "dialog.h"
//------------------------------------------------------------------------------------------------------
typedef struct {
STR32 TimeStamp;
FILENAME FileName;
} INF_HEADER;
//------ Language-dependent texts in EXPORT.DLL --------------------------------------------------------
DLL_IMPORT LPSTR
eStartUpText [],
eDefaultName [],
eDialogText [],
eMessageText [];
//------------------------------------------------------------------------------------------------------
static HINSTANCE hInstDLL, // Instance handle of the main DLL
hLanguage, // Instance handle of the language DLL
hGlobalInst; // Instance handle of the serving application
static HWND hGlobalWnd; // Main window handle of the serving application
//------------------------------------------------------------------------------------------------------
static HBITMAP hBitmap;
static INF_HEADER INFHeader;
static int gError; // Current error status ( 0 = OK )
//------------------------------------------------------------------------------------------------------
BOOL ModuleLoadSettings( void )
{
BOOL Result = FALSE;
if( TosoProfileReadKeyOpen( "EXPORT", FALSE ) ) {
if( TosoProfileReadData( "Init", (LPBYTE) &INFHeader, sizeof( INFHeader ) ) )
Result = TRUE;
TosoProfileReadKeyClose();
INFHeader.TimeStamp[31] = 0x00;
if( lstrcmp( INFHeader.TimeStamp, USER_DATA_ID ) )
Result = FALSE;
}
if( !Result ) {
lstrcpy( INFHeader.FileName, eDefaultName[0] );
}
return( Result );
}
//------------------------------------------------------------------------------------------------------
BOOL ModuleSaveSettings( void )
{
BOOL Result = FALSE;
if( TosoProfileWriteKeyOpen( "EXPORT", FALSE ) ) {
lstrcpy( INFHeader.TimeStamp, USER_DATA_ID );
if( TosoProfileWriteData( "Init", (LPBYTE) &INFHeader, sizeof( INFHeader ) ) )
Result = TRUE;
TosoProfileWriteKeyClose();
}
return( Result );
}
//------------------------------------------------------------------------------------------------------
// This procedure is used as callback procedure for an object enumeration based on the interface
// procedure TosoEnumerateAll(). It simply runs through of the object described in EnumData and write
// the coordinates of all its definition points to the currently open file.
// After each coordinate pair written, it also updates the current progress indicator and checks whether
// the user has pressed the Cancel button to stop the export.
BOOL ModuleEnumCallback( const ENUMDEF_DATA* EnumData )
{
DUMMYSTR Text1, Text2;
int Count;
switch( EnumData->EnumData ) {
case ENUMDATA_CURVE:
case ENUMDATA_AREA:
case ENUMDATA_MARK:
for( Count = 0; Count < EnumData->EnumCount; Count++ ) {
TosoFileWriteShort ( DB_POINT_ANY );
TosoFileWriteCommaDouble( EnumData->PointPtr[Count].x );
TosoFileWriteCommaDouble( EnumData->PointPtr[Count].y );
TosoFileWriteSemi();
if( TosoFileWriteError() ) {
gError = 1;
break;
}
wsprintf( Text1, eDialogText[3], TosoFileWriteCurrentLine() );
wsprintf( Text2, eDialogText[4], ( TosoFileWriteCurrentSize() + 1023 ) / 1024 );
TosoDialogUpdateProgress( Text1, Text2, NOPARAM, NOPARAM );
if( TosoDialogIsCanceled() ) {
gError = 999;
break;
}
}
break;
}
return( !gError );
}
//------------------------------------------------------------------------------------------------------
// This procedure performs the export. It starts the object enumeration (which writes coordinate pairs
// to the file).
// In addition, it initializes and display a progress indicator window to inform the user about the
// current progress and to allow him to cancel the export. Since the final file size is not known
// in advance, the progress indicator does not include a percent bar.
void ModuleExport( HANDLE FileHandle, const LPSTR FileName )
{
FILENAME FileName2;
DUMMYSTR DummyStr;
gError = 0;
if( !TosoFileWriteInitDisk( FileHandle ) ) {
gError = 1;
return;
}
TosoFileSplitName( FileName, NULL, FileName2 );
wsprintf( DummyStr, eDialogText[2], FileName2 );
TosoDialogShowProgress( eDialogText[0], DummyStr, FALSE );
TosoEnumerateAll( TosoDrawingGetActive(), FLAG_USE, FLAG_USE,
ENUMMODE_PLAIN | ENUMMODE_LINES | ENUMMODE_LINETYPES,
(TOSOENUMOBJECT_PROC) ModuleEnumCallback );
TosoFileWriteShort( DB_END );
TosoFileWriteSemi();
if( !TosoFileWriteFlush() )
gError = 1;
TosoFileWriteExit();
TosoDialogHideProgress();
}
//------------------------------------------------------------------------------------------------------
// This DLL entry procedure must exist in any DLL to be used in Win32. Since our DLL does all necessary
// initialization in its TosoModuleInit() procedure, this procedure is quite empty.
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD Reason, LPVOID Dummy )
{
switch( Reason ) {
case DLL_PROCESS_ATTACH:
hInstDLL = hInstance;
break;
case DLL_PROCESS_DETACH:
hInstDLL = NULL;
break;
}
return( TRUE );
}
//------------------------------------------------------------------------------------------------------
// This procedure is called when the module is loaded by the serving application. Its main tasks are:
// - Checking whether it is compatible with the given InterfaceVersion
// - Checking whether it is licensed to the given serial number (optional)
// - Storing of the serving application's instance and main windows handle for further use
// - Loading of the language-dependent library
// - Filling in the module ID structure whose address is passed in ModuleID
// - Loading of options from the registry database
// - Loading profiles
// - Allocating any static memory required
DLL_EXPORT BOOL TosoModuleInit( const LPSTR SerialNumber, HINSTANCE hMainInst, HWND hMainWnd,
int InterfaceVersion, MODULE_ID* ModuleID )
{
if( InterfaceVersion < TOSO_INTERFACE_VERSION ) {
MessageBox( hMainWnd, eMessageText[0], eDialogText[0], MB_OK );
return( FALSE );
}
if( !lstrcmp( SerialNumber, "DEMO" ) )
return( FALSE );
hGlobalInst = hMainInst;
hGlobalWnd = hMainWnd;
hLanguage = LoadLibrary( "EXPORT.DLL" );
hBitmap = LoadBitmap( hLanguage, "IDB_COMMAND" );
ModuleID->OwnerID = DB_OWNER_TOSO;
ModuleID->ModuleID = 0x2000;
ModuleID->ModuleCTRL = MODULECTRL_ALL;
ModuleID->ModuleProc.InputPointInitProc = (TOSOINPUTPOINTINIT_PROC) NULL;
ModuleID->ModuleProc.InputPointMoveProc = (TOSOINPUTPOINTMOVE_PROC) NULL;
ModuleID->ModuleProc.InputPointExitProc = (TOSOINPUTPOINTEXIT_PROC) NULL;
ModuleID->ModuleProc.InputDisplayProc = (TOSOINPUTDISPLAY_PROC) NULL;
ModuleID->ModuleProc.InputParameterProc = (TOSOINPUTPARAMETER_PROC) NULL;
ModuleID->ModuleProc.InputCancelProc = (TOSOINPUTCANCEL_PROC) NULL;
ModuleID->ModuleProc.InputFinishProc = (TOSOINPUTFINISH_PROC) NULL;
ModuleID->ModuleData.Type = MODULETYPE_EXPORT;
ModuleID->ModuleData.InputData.CommandMode = COMMAND_DIRECT;
ModuleID->ModuleData.MenuData.MenuEntry = eStartUpText[1];
ModuleID->ModuleData.MenuData.Description = eStartUpText[2];
ModuleID->ModuleData.IconHandle = hBitmap;
ModuleID->ModuleData.IconXOffset = 0;
ModuleID->ModuleData.IconYOffset = 0;
ModuleID->ModuleData.IconMode = 0;
ModuleID->CommandData = NULL;
ModuleLoadSettings();
return( TRUE );
}
//------------------------------------------------------------------------------------------------------
// This procedure is called when the module is removed by the serving application. Its main tasks are:
// - Checking whether anything is to be saved. If so, it should display a message information the user
// about it and allowing him to save those changes.
// - Freeing of all statically allocated memory.
// If this procedure return FALSE, the serving application will not be able to terminate. So please, do
// only return FALSE if shutting down the module now would severely damage or destroy user data.
DLL_EXPORT BOOL TosoModuleExit( void )
{
ModuleSaveSettings();
DeleteBitmap( hBitmap );
return( TRUE );
}
//------------------------------------------------------------------------------------------------------
// This procedure serves as hook procedure for the comman file open dialog window. It manages the Infos
// button that has been added to the standard GetSaveFileName dialog template.
// In a more sophisticated export module, the common dialog would also contain a Options button which
// would also be managed in this procedure.
UINT CALLBACK TosoModuleGetFileNameHook( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message ) {
case WM_INITDIALOG: // Initialize dialog box
TosoDialogCenter( hDlg ); // Center dialog window
return( 1 );
case WM_COMMAND:
switch( GET_WM_COMMAND_ID( wParam, lParam ) ) {
case IDD_BUTTON0: // Infos
MessageBox( hDlg, eStartUpText[0], eDialogText[0], MB_OK );
return( 1 );
}
break;
case WM_ENTERIDLE:
return( TosoDialogEnterIdle( hDlg, wParam, lParam ) );
default:
if( message == TosoDialogHelpMessage() ) {
WinHelp( hDlg, "EXPORT.HLP", HELP_CONTEXT, 1 );
return( 1 );
}
break;
}
return( 0 ); // Didn't process a message
}
//------------------------------------------------------------------------------------------------------
// This procedure is called when a module's command is chosen by the user. For an export filter, its
// main tasks are:
// - Prompting the user for the file name of the export file. This should usually be done by means of
// common dialog windows extended by some additional buttons like Infos and Options
// - Opening the export file
// - Calling the basic export procedure
// - Closing the export file
// - Error handling and display
DLL_EXPORT BOOL TosoModuleCommand( int CommandID, int ExecMode )
{
static OPENFILENAME OpenData;
static FILENAME FileName;
HANDLE FileHandle;
DUMMYSTR DummyStr;
DWORD CmnDlgError;
BOOL Result = FALSE;
if( CommandID != 0 )
return( FALSE );
// Check whether a help topic is to be displayed instead of starting a command.
if( ExecMode == MODULEEXEC_HELP ) {
WinHelp( hGlobalWnd, "EXPORT.HLP", HELP_CONTEXT, 1 );
return( FALSE );
}
lstrcpy( FileName, INFHeader.FileName );
OpenData.lStructSize = sizeof( OPENFILENAME );
OpenData.hwndOwner = hGlobalWnd;
OpenData.hInstance = hLanguage;
OpenData.lpstrFilter = eDialogText[1];
OpenData.lpstrCustomFilter = NULL;
OpenData.nMaxCustFilter = 0;
OpenData.nFilterIndex = 1;
OpenData.lpstrFile = FileName;
OpenData.nMaxFile = sizeof( FileName );
OpenData.lpstrFileTitle = NULL;
OpenData.nMaxFileTitle = 0;
OpenData.lpstrInitialDir = NULL;
OpenData.lpstrTitle = eDialogText[0];
OpenData.Flags = OFN_HIDEREADONLY | OFN_NONETWORKBUTTON | OFN_SHOWHELP |
OFN_ENABLEHOOK | OFN_ENABLETEMPLATE | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
OpenData.nFileOffset = 0;
OpenData.nFileExtension = 0;
OpenData.lpstrDefExt = eDefaultName[2];
OpenData.lCustData = NOPARAM;
OpenData.lpfnHook = (LPOFNHOOKPROC) TosoModuleGetFileNameHook;
OpenData.lpTemplateName = "GETFILENAME";
Result = GetSaveFileName( &OpenData ); // Open common dialog window
if( !Result ) // TRUE=OK, FALSE=cancel or error
CmnDlgError = CommDlgExtendedError(); // 0=cancel, else error number
if( !Result ) { // Cancel
if( CmnDlgError ) { // Error in common dialog
wsprintf( DummyStr, eMessageText[3], CmnDlgError );
MessageBox( hGlobalWnd, DummyStr, eDialogText[0], MB_OK );
}
return( TRUE );
}
else // Store the selected file name
lstrcpy( INFHeader.FileName, FileName );
Result = FALSE;
SetCursor( LoadCursor( NULL, IDC_WAIT ) );
if( TosoFileCreate( &FileHandle, FileName ) ) {
ModuleExport( FileHandle, FileName );
TosoFileClose( FileHandle );
switch( gError ) {
case 999:
TosoFileDelete( FileName );
MessageBox( hGlobalWnd, eMessageText[2], eDialogText[0], MB_OK );
Result = TRUE;
break;
case 0:
Result = TRUE;
break;
default:
TosoFileDelete( FileName );
MessageBox( hGlobalWnd, eMessageText[4], eDialogText[0], MB_OK );
Result = FALSE;
break;
}
}
return( Result );
}